home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 4 / FM Towns Free Software Collection 4 - Disc 1.iso / msdos / attr102 / attr.c next >
Text File  |  1991-10-18  |  5KB  |  163 lines

  1. /*************************************************************************
  2.               ATTR.C     Ver.1.02
  3.  
  4.        ATTR [{+/-}{r/h/s/a}] [YY:MM:DD] [HH:MM:SS] <file name>
  5.  
  6.     このプログラムを C言語の勉強に使用しないでください。
  7.    但し、悪い見本で使用する場合は、この限りではありません。
  8.    若し、使用した場合は、すぐに忘れることをお勧めします。(^^;)
  9.  
  10. *************************************************************************/
  11.  
  12. #include <dos.h>
  13. #include <fcntl.h>
  14.  
  15. struct find_t 
  16.     {
  17.     char reserved[21];
  18.     char attrib;
  19.     unsigned wr_time;
  20.     unsigned wr_date;
  21.     long size;
  22.     char name[13];
  23.     };*/
  24. struct find_t f;
  25.  
  26. void set_attr(char*);
  27. int val(char*);
  28. void guide(char*);
  29. /************************** main routine *********************************/
  30. main(int argc,char *argv[])
  31.  
  32. {
  33. char buf[50];
  34. int i=0,j=0,k=0,err=0;
  35. unsigned attrib,date,time;
  36.  
  37. if (argc==1)
  38.     {
  39.     guide(argv[0]);
  40.     return(0);
  41.     }
  42.  
  43. while (buf[k]=*(argv[argc-1]+k)) k++;
  44. while (k>=0 && buf[--k]!=0x5c && buf[k]!=0x3a);
  45. buf[++k]=0;
  46. printf("---------------+-----------------------------------------------------------\n");
  47. printf("     path      | %s\n",argv[argc-1]);
  48. printf("---------------+---------------------------+----------+----------+---------\n");
  49. printf("   file name   |         attribute         |   date   |   time   |   size\n");
  50. printf("---------------+---------------+-----------+----------+----------+---------\n");
  51.  
  52. while (1)
  53.     {
  54.     if (!j)  i=_dos_findfirst(argv[argc-1],0x3f,&f);
  55.     if (j++) i=_dos_findnext(&f);
  56.  
  57.     if (i) break;
  58.     for(i=0;buf[i+k]=*(f.name+i);i++);
  59.     buf[i+k]=0;
  60.     if (argc>2)
  61.         {
  62.         attrib=f.attrib;
  63.         date  =f.wr_date;
  64.         time  =f.wr_time;
  65.         for(err=0,i=2;i<argc;i++) set_attr(argv[i-1]);
  66.  
  67.         if (attrib!=f.attrib) if (err =_dos_setfileattr(buf,f.attrib))
  68.             {
  69.             f.attrib=attrib;
  70.             }
  71.         if (date!=f.wr_date || time!=f.wr_time)
  72.             {
  73.             if (_dos_open(buf,O_WRONLY,&i))
  74.                 {
  75.                 f.wr_date=date;
  76.                 f.wr_time=time;
  77.                 err++;
  78.                 }
  79.                 else
  80.                 err +=_dos_setftime(i,f.wr_date,f.wr_time);
  81.             _dos_close(i);
  82.             }
  83.         }
  84.  
  85.     printf("%14s",f.name);
  86.     printf("%c",err?'*':' ');
  87.     printf("|%s", f.attrib & _A_RDONLY ? "R/O" : "   " );
  88.     printf(" %s", f.attrib & _A_HIDDEN ? "Hid" : "   " );
  89.     printf(" %s", f.attrib & _A_SYSTEM ? "Sys" : "   " );
  90.     printf(" %s", f.attrib & _A_ARCH   ? "Arc" : "   " );
  91.     printf("|%s", f.attrib & _A_VOLID  ? "Vol" : "   " );
  92.     printf(" %s", f.attrib & _A_SUBDIR ? "Dir    " :"    Fil" );
  93.     printf("| %02d-%02d-%02d ",((f.wr_date>>9 & 127)+80)%100
  94.                   , f.wr_date>> 5 & 15
  95.                   , f.wr_date     & 31);
  96.     printf("| %02d:%02d:%02d ", f.wr_time>>11 & 31
  97.                   , f.wr_time>> 5 & 63
  98.                   ,(f.wr_time     & 31)* 2 );
  99.     (f.attrib & 0x18) ? printf("|********\n") : printf("|%8ld\n",f.size);
  100.     }
  101. printf("---------------+---------------+-----------+----------+----------+---------\n");
  102. printf("                                                                %3d file(s).\n",j-1);
  103. return (j-1);
  104. }
  105.  
  106. /******************* sub routine *******************/
  107.  
  108. void set_attr(char set[])
  109.  
  110. {
  111. int i;
  112.  
  113. if (set[0]=='+' || set[0]=='-') for (i=1;set[i]!=0;i++)
  114.     {
  115.     if (set[i] < 97) set[i] += 32;
  116.     if (set[0]=='-') f.attrib = ~f.attrib;
  117.     if (set[i]=='s') f.attrib |= _A_SYSTEM;
  118.     if (set[i]=='r') f.attrib |= _A_RDONLY;
  119.     if (set[i]=='h') f.attrib |= _A_HIDDEN;
  120.     if (set[i]=='a') f.attrib |= _A_ARCH;
  121.     if (set[0]=='-') f.attrib = ~f.attrib;
  122.     }
  123. if (set[2]=='-' && set[5]=='-')
  124.     f.wr_date=(((val(&set[0])+20)%100)<<9)+(val(&set[3])<<5)+val(&set[6]);
  125. if (set[2]==':' && set[5]==':')
  126.     f.wr_time=(val(&set[0])<<11)+(val(&set[3])<<5)+val(&set[6])/2;
  127. }
  128.  
  129. int val(char *a)
  130.  
  131. {
  132. int b=0;
  133.  
  134. while (*a>='0' && *a<='9') b=b*10+(int)(*a++)-48;
  135. return (b);
  136. }
  137.  
  138. void guide(char *name)
  139.  
  140. {
  141. printf("+----------------------------------------------------------------------------+\n");
  142. printf("|                  ATTRIBUTE  EXCHANGER        ver 1.02    |\n");
  143. printf("+----------------------------------------------------------------------------+\n");
  144. printf("|                                                                            |\n");
  145. printf("|  path :  %-66s|\n",name);
  146. printf("| option:          [{+|-}{r|h|s|a}・・・] [YY-MM-DD] [HH:MM:SS] <ファイル名>  |\n");
  147. printf("|                                                                            |\n");
  148. printf("|      ファイル名(含ディレクトリ)で指定されたファイルの                    |\n");
  149. printf("|                       属性、日付、時刻を変更、また、表示 を行います。      |\n");
  150. printf("+----------------------------------------------------------------------------+\n");
  151. printf(" | +   以降に指定したファイルの属性を設定します。  |\n");
  152. printf(" | -   以降に指定したファイルの属性を削除します。  |\n");
  153. printf(" |                                                 |\n");
  154. printf(" | r   読出のみ可能              [ R/O ] Read only |\n");
  155. printf(" | h   隠しファイル              [ Hid ] Hidden    |\n");
  156. printf(" | s   システムファイル          [ Sys ] System    |\n");
  157. printf(" | a   書き込みされたファイル    [ Arc ] Archives  |\n");
  158. printf(" |     ボリューム・ラベル        [ Vol ] Volume    |\n");
  159. printf(" |     サブ・ディレクトリ        [ Dir ] Directly  |\n");
  160. printf(" |     ファイル                  [ Fil ] File      |\n");
  161. printf(" +-------------------------------------------------+\n");
  162. }
  163.